package com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.company;

import cn.hutool.core.util.ObjectUtil;
import com.xiaoshuidi.cloud.module.contract.controller.admin.bill.vo.orderFees.OrderFeesVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;

/**
 * 管理后台 - 企业合同创建 Request VO
 */
@Schema(description = "管理后台 - 企业合同创建 Request VO")
@Data
public class CompanyContractCreateReqVO {

    /**
     * 企业客户id
     */
    @Schema(description = "企业客户id")
    private Long customerCompanyId;
    /**
     * 企业名称
     */
    private String companyName;
    /**
     * 费用承担方式
     */
    @Schema(description = "费用承担方式")
    private Integer orderShareMethod;
    /**
     * 企业合同编号
     */
    @Schema(description = "企业合同编号")
    private String contractNo;
    /**
     * 纸质合同编号
     */
    @Schema(description = "纸质合同编号")
    private String offlineNo;
    /**
     * 合同类型 paper纸质合同 | electronic 电子合同
     */
    @Schema(description = "合同类型")
    private String contractSort;
    /**
     * 合同分类 normal 普通合同 | segmented 分段合同 |rentfree 免租期合同
     */
    @Schema(description = "合同分类")
    private String contractType;
    /**
     * 是否按自然月 0 默认非自然月 1 自然月
     */
    @Schema(description = "是否按自然月")
    private Integer naturalMonthOrder;

    /**
     * 紧急联系人姓名
     */
    @Schema(description = "紧急联系人姓名")
    @NotNull(message = "紧急联系人姓名不能为空")
    private String emergencyContactName;

    /**
     * 紧急联系人手机号
     */
    @Schema(description = "紧急联系人手机号")
    @NotNull(message = "紧急联系人手机号不能为空")
    private String emergencyContactPhone;

    /**
     * 紧急联系人关系
     */
    @Schema(description = "紧急联系人关系")
    private String emergencyContactRelationship;
    /**
     * 开始日期
     */
    @Schema(description = "开始日期")
    private LocalDate startTime;
    /**
     * 结束日期
     */
    @Schema(description = "结束日期")
    private LocalDate endTime;

    /**
     * 是否统一定价
     */
    @Schema(description = "是否统一定价")
    @NotNull(message = "请选择是否是统一定价")
    private Boolean isUnifiedPricing;

    /**
     * 统一定价月租金
     */
    @Schema(description = "统一定价月租金")
//    @DecimalMin(value = "0.01", message = "租金最小值不能低于0.01元")
    private BigDecimal monthRental;
    /**
     * 物业费
     */
    @Schema(description = "物业费")
    private BigDecimal propertyAmount;
    /**
     * 付几
     */
    @Schema(description = "付几")
    private Integer payMethodF;
    /**
     * 押几
     */
    @Schema(description = "押几")
    private Integer payMethodY;

    /**
     * 是否按租金原价 0（按租金原价加物业费） | 1 原价
     */
    @Schema(description = "是否按租金原价 0（按租金原价加物业费） 1")
    private Integer isOriginalDeposit;

    /**
     * 是收租类型
     */
    @Schema(description = "收租类型")
    private String rentPayWay;

    /**
     * 收租类型天数
     */
    @Schema(description = "收租类型天数")
    private Integer advancedDays;

    /**
     * 优惠类型 cycle 周期性优惠 | once 一次性优惠
     */
    @Schema(description = "优惠类型")
    private String discountSort;
    /**
     * 优惠方式
     */
    @Schema(description = "优惠方式")
    private String discountType;
    /**
     * 优惠值
     */
    @Schema(description = "优惠值")
    private BigDecimal discountValue;

    /**
     * 此合同对应的房间id列表
     */
    @Schema(description = "签约房间")
    private List<Long> roomIds;

    /**
     * 杂费列表
     */
    @Schema(description = "杂费列表")
    private List<OrderFeesVo> fees;

    /**
     * 签约人姓名-甲方
     */
    @Schema(description = "签约人姓名")
    private String signerName;
    /**
     * 签约时间
     */
    @Schema(description = "签约时间")
    private LocalDate signedTime;
    /**
     * 客户来源
     */
    @Schema(description = "客户来源")
    private String source;
     /**
     * 一次性优惠金额计入首期或末期账单
     */
    @Schema(description = "一次性优惠金额计入首期或末期账单")
    private String discountOrder;
    /**
     * 合同签约发起人-甲方
     */
    @Schema(description = "合同签约发起人-甲方")
    private Long signerId;
    /**
     * 合同附件地址
     */
    private String contractUrl;
    /**
     * 押金 选择其他押金时需传值
     */
    private BigDecimal deposit;

    @AssertTrue(message = "租金最小值不能低于0.01元")
    public boolean isTrue(){
        return !this.getIsUnifiedPricing() || ObjectUtil.isNotEmpty(this.monthRental) && this.monthRental.compareTo(BigDecimal.ZERO) > 0;
    }
}
